/**
 *
 */
package br.com.werp.regras.suporte.controle;

import br.com.werp.regras.geral.Acesso;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.Relatorio;
import br.com.werp.regras.geral.Suporte;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.JRDataSourcePadrao;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.relatorio.RelatorioVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.suporte.ManutencaoVO;
import br.com.werp.regras.geral.vos.suporte.MaquinaVO;
import br.com.werp.regras.geral.vos.suporte.RelatorioManutencaoFormVO;
import br.com.werp.regras.geral.vos.suporte.RelatorioManutencaoVO;
import br.com.werp.regras.geral.vos.tabelas.Maquina;
import br.com.werp.regras.geral.vos.tabelas.Usuario;
import br.com.werp.regras.geral.vos.tesouraria.DocumentoVencimentoRelatorioVO;
import br.com.werp.regras.geral.vos.tesouraria.RelatorioDependentesFormVO;
import br.com.werp.regras.suporte.integracao.FabricaDAO;
import br.com.werp.regras.suporte.integracao.ManutencaoDAO;
import br.com.werp.regras.suporte.integracao.MaquinaDAO;
import br.com.werp.regras.tesouraria.controle.ControleDependeteRelatorio;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Timestamp;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author marcos
 *
 */
public class ControleRelatorioManutencao {
    public RelatorioVO gerarRelatorioManutencao(Object form, String requisitor,
        String empresa) throws Exception {
        RelatorioManutencaoFormVO relatorioManutencaoFormVO = new RelatorioManutencaoFormVO();
        BeanUtil.copiarVO(form, relatorioManutencaoFormVO);

        Map parameters = BeanUtils.describe(form);

        List listaRelatorio = processarRelatorioManutencao(relatorioManutencaoFormVO,
                requisitor);

        Usuario usuario = new Usuario();
        usuario.setUsur_login(requisitor);

        Acesso acesso = FabricaSubSistema.getAcesso();

        usuario = (Usuario) Util.get0(acesso.pesquisarUsuarios(usuario));

        Suporte suporte = FabricaSubSistema.getSuporte();
        EmpresaVO empresaVO = new EmpresaVO();
        empresaVO.setEmpr_id(Util.zeroOuInt(empresa));

        empresaVO = (EmpresaVO) Util.get0(suporte.obterEmpresaVO(empresaVO));

        Relatorio relatorio = FabricaSubSistema.getRelatorio();
        parameters.put("empresa", empresaVO.getEmpr_descricao());
        parameters.put(Relatorio.IMAGE_URI, "/suporte/imgJasper/");
        parameters.put("usuario", usuario.getUsur_nome());
        parameters.put("data_relatorio",
            new Timestamp(System.currentTimeMillis()));

        return relatorio.processarRelatorio(new JRDataSourcePadrao(
                listaRelatorio), "RelatorioManutencao",
            relatorioManutencaoFormVO.getTipo_relatorio(), parameters,
            FabricaSubSistema.getSuporte(), new HashMap(), new HashMap());
    }

    private List processarRelatorioManutencao(
        RelatorioManutencaoFormVO relatorioManutencaoFormVO, String requisitor)
        throws Exception {
        Maquina maquina = new Maquina();
        MaquinaDAO maquinaDAO = FabricaDAO.getMaquinaDAO();

        if (!Util.isNullOrEmpty(relatorioManutencaoFormVO.getMaquina())) {
            maquina.setMaqn_nome(relatorioManutencaoFormVO.getMaquina());
        }

        List listaMaquinas = maquinaDAO.obterMaquina(maquina);
        List retorno = new LinkedList();

        for (Iterator iter = listaMaquinas.iterator(); iter.hasNext();) {
            maquina = (Maquina) iter.next();

            ManutencaoDAO manutencaoDAO = FabricaDAO.getManutecaoDAO();

            ManutencaoVO manutencaoVO = new ManutencaoVO();
            manutencaoVO.setManu_maquina(maquina.getMaqn_id());

            List listaManutencoes = manutencaoDAO.pesquiarManutencaoVO(manutencaoVO);

            for (Iterator iterator = listaManutencoes.iterator();
                    iterator.hasNext();) {
                manutencaoVO = (ManutencaoVO) iterator.next();

                RelatorioManutencaoVO relatorioManutencaoVO = new RelatorioManutencaoVO();
                relatorioManutencaoVO.setMaqn_id(maquina.getMaqn_id());
                relatorioManutencaoVO.setMaqn_nome(maquina.getMaqn_nome());
                relatorioManutencaoVO.setManu_data(manutencaoVO.getManu_data());
                relatorioManutencaoVO.setManu_problema(manutencaoVO.getManu_problema());
                relatorioManutencaoVO.setManu_solucao(manutencaoVO.getManu_solucao());
                retorno.add(relatorioManutencaoVO);
            }
        }

        Collections.sort(retorno,
            new Comparator() {
                public int compare(Object o1, Object o2) {
                    RelatorioManutencaoVO rel1 = (RelatorioManutencaoVO) o1;
                    RelatorioManutencaoVO rel2 = (RelatorioManutencaoVO) o2;

                    return rel1.getManu_data().compareTo(rel2.getManu_data());
                }
            });

        return retorno;
    }

    public static void main(String[] executar) throws Exception {
        ControleRelatorioManutencao controleRelatorioManutencao = new ControleRelatorioManutencao();

        RelatorioManutencaoFormVO relatorioManutencaoFormVO = new RelatorioManutencaoFormVO();
        relatorioManutencaoFormVO.setTipo_relatorio(Relatorio.TIPO_HTML);

        Util.verRelartorio(controleRelatorioManutencao.gerarRelatorioManutencao(
                relatorioManutencaoFormVO, "", ""));
    }
}
